🚀 Mac 实战:将 Android 模拟器 ADB 端口暴露给局域网

头像
2025年09月16日

在进行 Android 远程调试或群控开发时,我们经常需要让局域网内的其他电脑(或 CI/CD 服务器)连接到 Mac 上运行的 Android 模拟器。

# Mac # 安卓模拟器 # 远程连接 # ADB
🚀 Mac 实战:将 Android 模拟器 ADB 端口暴露给局域网

在进行 Android 远程调试或群控开发时,我们经常需要让局域网内的其他电脑(或 CI/CD 服务器)连接到 Mac 上运行的 Android 模拟器。

由于模拟器默认只监听本地回环地址(127.0.0.1),局域网无法直接访问。本文将通过 adb forward 配合 socat 端口转发工具来解决这个问题。


🛠️ 第一步:环境准备与模拟器启动

1. 安装 Android Studio

前往 Google 官网下载并安装 Android Studio for Mac

2. 创建并启动模拟器

打开 Android Studio -> Device Manager,创建一个新的虚拟设备(AVD)并启动它。确保模拟器已正常运行进入桌面。

3. 安装网络转发工具 Socat

我们需要 socat 来打通 局域网 IP127.0.0.1 的桥梁。 使用 Homebrew 安装:

brew install socat

⚙️ 第二步:配置 ADB 端口映射

我们需要先将 Mac 的本地端口映射到模拟器的内部端口,然后再将局域网端口映射到 Mac 的本地端口。

1. 检查设备连接

确保 ADB 能识别到模拟器:

adb devices
# 输出示例:
# List of devices attached
# emulator-5554	device

2. 开启远程调试监听(可选)

虽然模拟器通常默认开启,但执行此命令可确保服务在 5555 端口就绪:

adb tcpip 5555

3. 设置本地端口转发 (Host -> Emulator)

将 Mac 本地的 1555 端口流量转发到模拟器的 5555 端口:

adb forward tcp:1555 tcp:5555

此时,你通过 adb connect 127.0.0.1:1555 已经可以连接模拟器了,但这仅限本机。


🌐 第三步:开启局域网转发 (LAN -> Host)

现在使用 socat 将局域网 IP 的端口转发到刚才配置的 127.0.0.1:1555

1. 获取局域网 IP

在终端输入 ifconfig | grep inet 查看你的局域网 IP(假设为 10.0.8.2)。

2. 启动 Socat 转发

# 语法:socat TCP-LISTEN:[局域网端口],bind=[局域网IP],fork TCP:127.0.0.1:[本地映射端口]
socat TCP-LISTEN:1555,bind=10.0.8.2,fork TCP:127.0.0.1:1555

注意:运行此命令后终端会挂起(监听状态),请不要关闭窗口,或者使用 nohup 让其在后台运行。


🤖 第四步:自动化保活脚本

ADB 的 Forward 规则有时会因为模拟器重启或 ADB 服务重置而失效。我们可以使用以下脚本进行自动检测和重连。

优化后的脚本 (auto_forward.sh):

#!/bin/bash

# 配置部分
ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb"  # ADB 路径,建议根据实际情况修改
LOCAL_PORT=1555
EMULATOR_PORT=5555

# 检查 ADB 是否存在
if [ ! -f "$ADB_PATH" ]; then
    echo "❌ 错误: 未找到 adb,请检查路径: $ADB_PATH"
    # 如果已配置环境变量,尝试直接使用 adb 命令
    ADB_PATH="adb"
fi

echo "🚀 开始监控 ADB 端口转发..."

# 1. 检查是否有设备连接
if ! "$ADB_PATH" devices | grep -q "device"; then
    echo "⚠️  错误: 未检测到在线的 Android 设备,请先启动模拟器。"
    exit 1
fi

# 2. 进入无限循环监控
while true; do
    # 检查转发规则是否存在
    # adb forward --list 输出示例:emulator-5554 tcp:1555 tcp:5555
    if ! "$ADB_PATH" forward --list | grep -q "tcp:$LOCAL_PORT tcp:$EMULATOR_PORT"; then
        echo "🔄 [$(date +%T)] 转发失效或未建立,正在尝试重连..."
  
        # 尝试建立转发
        if "$ADB_PATH" forward tcp:$LOCAL_PORT tcp:$EMULATOR_PORT; then
            echo "✅ [$(date +%T)] 转发成功: 127.0.0.1:$LOCAL_PORT -> Emulator:$EMULATOR_PORT"
        else
            echo "❌ [$(date +%T)] 转发失败,请检查端口占用或设备状态。"
        fi
    else
        # 可选:如果不需要频繁输出日志,可以注释掉下面这行
        # echo "✅ [$(date +%T)] 转发状态正常"
        : 
    fi
  
    sleep 10  # 每10秒检查一次
done

使用方法:

  1. 保存为 auto_forward.sh
  2. 赋予执行权限:chmod +x auto_forward.sh
  3. 运行脚本:./auto_forward.sh

✅ 验证连接

现在,在局域网内的另一台电脑上,执行以下命令即可连接你的 Mac 模拟器:

# 假设 Mac 的 IP 是 10.0.8.2
adb connect 10.0.8.2:1555

如果连接成功,你就可以像操作本地设备一样进行调试了!